package generator.workflow.sfj.gridgain;

import generator.datastructure.MethodDeclaration;
import generator.datastructure.WritebleClass;
import generator.workflow.Parallelizer;
import generator.workflow.sfj.SFJPeerClassDirector;

/**
 * Esta clase genera código gridificable para el middleware GridGain sobre
 * archivos fuente de java que respetan las convenciones estipuladas. Es por ello que
 * implementa la interface {@link Parallelizer} que el generador de código
 * gridificable exige.
 */
public class GridGainGridifier extends SFJPeerClassDirector {
	
	/**
	 * GridJob que define la forma en que se crearan las clases de tipo Job necesarias para
	 * la gridificación de un método.
	 */
	private GridJob jobClassBuilder;
	
	/**
	 * GridResult que define la forma en que se crearan las clases de tipo Result necesarias para
	 * la gridificación de un método.
	 */
	private GridResult resultClassBuilder;
	
	
	/** Constructor vacío de la clase */
	public GridGainGridifier() {

	}

	/**
	 * Método encargado de generar la clase Peer mediante el peerClassDirectory. Además exportar los GridJob y GridResult 
	 * correspondientes a cada método que se desee gridificar.
	 * 
	 * @return WritebleClass Clase Peer modificada para gridificar
	 */
	public void parallelizeMethod(MethodDeclaration md) {		
				
		super.parallelizeMethod(md);
		
		WritebleClass gridifiedClass = this.getPeerClassBuilder().getPeerClass();		
		
		WritebleClass jobClass = jobClassBuilder.getGridJobClass(md,gridifiedClass);
		jobClass.export(this.pi.getClassToParallelizeContentDirectory());
		WritebleClass resultClass = resultClassBuilder.getGridResultClass(md,gridifiedClass);
		resultClass.export(pi.getClassToParallelizeContentDirectory());			
		
	}
	
	public void setJobClassBuilder(GridJob jobClassBuilder) {
		this.jobClassBuilder = jobClassBuilder;
	}

	public void setResultClassBuilder(GridResult resultClassBuilder) {
		this.resultClassBuilder = resultClassBuilder;
	}

}
